<?php
class mysql{
	static private $config;
	private $db;		//数据库连接
	private $sql;		//预设SQL语句
	private $query;	//SQL执行结果
	private $transaction=0;	//判断是否有开启事务
	private $fetch_mode='assoc';		//取数据的方式
	private $dbprefix='';				//SQL语句替换的前缀
	
	private function __construct(){
		$this->connect();
		$this->dbprefix=self::$config['dbprefix'];
	}
	#创建连接
	private function connect(){
		$this->db=mysql_pconnect(self::$config['dbhost'].':'.self::$config['dbport'],self::$config['dbuser'],self::$config['dbpass']) or die(error_box('无法正常接数据库','-1',$_COOKIE['theme']));
		mysql_select_db(self::$config['dbname'],$this->db) or die(error_box('无法正常接数据库!!!!'.self::$config['dbname'],'-1',$_COOKIE['theme']));
		mysql_query('SET NAMES '.self::$config['charset']) ;
	}
	#数据库方法入法
	static function get_connect($config){
		self::$config=&$config;
		return new mysql();
	}
	#设置SQL语句
	function prepare($sql){
		$this->sql=$sql;
	}
	#执行预存SQL语句
	function execute(){
		$this->query=$this->query($this->sql);
		return $this->query;
	}
	#取得其中一条数据
	#如果没有SQL语句，将会返回预先设置的SQL语句
	function fetch($sql=null){
		$mode=$this->get_fetchmode();
		if (empty($sql)) {
			#如果没有SQL语句
			$query=$this->execute();
		}else{
			$query=$this->query($sql);
		}
		return $mode($query);
	}
	#取得所有结果
	#如果没有SQL语句，将会返回预先设置的SQL语句
	function fetchAll($sql=null){
		$mode=$this->get_fetchmode();
		if (empty($sql)) {
			#如果没有SQL语句
			$query=$this->execute();
		}else{
			$query=$this->query($sql);
		}
		if(!$query){
			error_box('数据库操作错误','-1');
		}
		$return=array();

		while($row=$mode($query)){
			$return[]=$row;
		}
		return $return;
	}
	#取得其中一个结果
	#如果没有SQL语句，将会返回预先设置的SQL语句
	function fetchColumn($sql=null){
		if (empty($sql)) {
			#如果没有SQL语句
			$query=$this->execute();
		}else{
			$query=$this->query($sql);
		}
		return mysql_result($query,0);
	}
	#取得预先设置SQL语句所影响的行数
	function countRow(){
		mysql_affected_rows($this->query);
	}
	#执行一个SQL语句,$need_id此方法在insert的时候用来取得最后一个插入的ID
	function query($sql,$need_id=0){
		if (empty($sql)) {
			//如果SQL语句为空，则自动返回假
			return false;
		}
		##替换SQL语句的前缀部份
		$sql=$this->replace_prefix($sql);
		if($need_id==0){
			#exit($sql);
			return mysql_query($sql);
		}else{
			mysql_query($sql);
			$id=''.mysql_insert_id();
			#exit($id);
			return $id;
		}
	}
	
	#取得取数据的方法
	private function get_fetchmode(){
		switch ($this->fetch_mode){
			case 'assoc':
				$mode='mysql_fetch_assoc';
				break;
			case 'array':
				$mode='mysql_fetch_array';
				break;
			case 'row':
				$mode='mysql_fetch_row';
				break;
			case 'obj':
				$mode='mysql_fetch_object';
				break;
			default:
				$mode='mysql_fetch_assoc';
				break;
		}
		return $mode;
	}
	/*事物相关方法*/
	#打开事物
	function beginTransaction(){
		if ($this->transaction>0) {		//如果已经开启事物
			return false;
		}
		mysql_query("SET AUTOCOMMIT=0");
		mysql_query('begin');
		$this->transaction++;
	}
	#结束事物，并提交
	#只会返回一个结果，true
	function commit(){
		if ($this->transaction>0) {
			mysql_query('COMMIT');
			mysql_query("SET AUTOCOMMIT=1");
			$this->transaction--;
		}
		return true;
	}
	#结束事物，并提交
	#只会返回一个结果，true
	function rollback(){
		if ($this->transaction>0) {
			mysql_query('ROLLBACK');
			mysql_query("SET AUTOCOMMIT=1");
			$this->transaction--;
		}
		return true;
	}
	#替换SQl语句中的前缀部份
	private function replace_prefix($strQuery){
		$strQuery=str_replace('`#__','`'.$this->dbprefix,$strQuery);
		return $strQuery;
	}
}
?>